#include "Menues.h"
#include "utils/Normalizador.h"
#include "ArchFrase/BloqueFrase.h"
#include <sstream>
#include <limits>


Menues::Menues(ArchFrases& frases, IndiceBooleano& idxBool) :
	archFrases(frases), idxBooleanos(idxBool)
{
}

Menues::~Menues() {
}


void Menues::cleanInput() const{
	if (std::cin.peek() == '\n'){
		std::cin.ignore();
	}
}


char Menues::getOpcionUsuario() const{
	char op = '\0';

	std::cout << ">> ";
	cleanInput();
	std::cin >> op;

	std::cout << std::endl;

	return op;
}


Operacion Menues::principal(){
	std::cout << "\nSeleccione una opción\n"
			<< "\t[a] - Inicializar los archivos de datos\n"
			<< "\t[o] - Abrir los archivos de datos\n"
			<< "\t[b] - Mantener las frases\n"
			<< "\t[c] - Consultar por indice booleano\n"
			<< "\t[d] - Consultar por indice de porciones de firmas\n"
			<< "\t[x] - Salir\n"
			<< std::endl;

	char op = getOpcionUsuario();

	Operacion resul = NADA;
	switch (op){
		case 'a':
			resul = INICIALIZAR_ARCHIVOS;
			break;
		case 'o':
			resul = ABRIR_ARCHIVOS;
			break;
		case 'b':
			resul = mantenerFrases();
			break;
		case 'c':
			resul = CONSULTA_IDX_BOOLEANO;
			break;
		case 'd':
			resul = CONSULTA_IDX_FIRMAS;
			break;
		case 'x':
			resul = SALIR;
			break;
	}

	return resul;
}


Operacion Menues::mantenerFrases(){
	std::cout << "Mantener las frases\n"
			<< "\t[a] - Alta de frase\n"
			<< "\t[b] - Baja de frase por ID\n"
			<< "\t[c] - Modificar frase por ID\n"
			<< "\t[x] - Volver\n"
			<< std::endl;

	char op = getOpcionUsuario();
	Operacion resul = NADA;
	switch (op){
		case 'a':
			resul = ALTA_FRASE;
			break;
		case 'b':
			resul = BAJA_FRASE;
			break;
		case 'c':
			resul = MODIFICAR_FRASE;
			break;
	}

	return resul;
}


std::string Menues::ingresarNombreArch(std::string txt){
	std::string nombre = "";
	std::cout << "Ingrese el nombre del archivo " << txt << "\n"
			<< ">> ";
	cleanInput();
	std::cin >> nombre;

	std::cout << std::endl;

	return nombre;
}


void Menues::mostrarResultados(std::vector<unsigned int> &vecIDDocumentos) const {
	// No hay frases para mostrar
	if (vecIDDocumentos.size() == 0){
		std::cout << "\n** No se encontraron frases coincidentes **\n" << std::endl;
		return;
	}

	// La cabecera
	std::cout << "ID\t|\t\tFrase\t\t|\tAutor" << std::endl;

	std::vector<unsigned int>::const_iterator it;
	for (it = vecIDDocumentos.begin(); it != vecIDDocumentos.end(); ++it){

		// Recupera el bloque con la frase desde el archivo y lo muestra en pantalla
		BloqueFrase bf;
		this->archFrases.leerFrase(bf, *it);
		std::cout << (*it) << "\t" << " | " << bf.getFrase() << " | " << bf.getAutor() << std::endl;
	}

	std::cout << std::endl;
}


std::vector<std::string> Menues::ingresarTerminosBusqueda() const{
	std::cout << "\nIngrese los terminos para la busqueda de frases:" << std::endl;
	std::cout << ">> ";

	cleanInput();
	std::string terminos = "";
	getline(std::cin, terminos);

	std::vector<std::string> vec;
	std::stringstream ss(terminos);
	do {
		std::string term = "";
		ss >> term;
		vec.push_back(term);

	} while (!ss.eof());

	return vec;
}


BloqueFrase Menues::ingresarNuevaFrase() const{
	std::cout << "\nIngrese una frase:" << std::endl;
	std::cout << ">> ";

	cleanInput();
	std::string frase = "";
	getline(std::cin, frase);
	frase = Normalizador::normalizarFrase(frase);

	std::cout << "\nIngrese el autor de la frase:" << std::endl;
	std::cout << ">> ";

	cleanInput();
	std::string autor = "";
	getline(std::cin, autor);

	BloqueFrase bf;
	bf.setAutor(autor);
	bf.setFrase(frase);
	return bf;
}


unsigned int Menues::ingresarIDFrase() const{
	std::cout << "\nIngrese el ID de una frase:" << std::endl;
	std::cout << ">> ";

	cleanInput();
	unsigned int id = 0;
	std::cin >> id;

	if (this->archFrases.getCantBloques() < id) return std::numeric_limits<unsigned int>::max();
	else return id;
}


